#include "client.h"

int main(void) 
{
	int mid, my_worker=0, done=-1, mret;
	pid_t my_pid = getpid();
	struct my_msgbuf msgs;
    key_t queuekey = ftok(".", 'B');

	if((mid=msgget(queuekey, 0666))<0) {
		printf("Error: Msg Queue setup failed.  client.c line 11\n\tEnsure server is running.\n");
		exit(-1);
	}

	sprintf(msgs.msg, "%d", my_pid);
	msgs.mtype = 1;
	if(msgsnd(mid, (struct msgbuf*) &msgs, strlen(msgs.msg)+1, 0)<0) {
		perror("Error: Msg Queue initial send failed.  client.c line 18");
		exit(-1);
	}

	if(msgrcv(mid, (struct msgbuf*) &msgs, sizeof(msgs.msg), my_pid, 0)<0) {
		perror("Error: Msg Queue recieve failed.  client.c line 23");
		exit(-1);
	}

	my_worker = atoi(msgs.msg);
	printf("Recieved worker id of: %d\n", my_worker);

	done = 0;
	
	while(1) {
		msgs.mtype = my_worker;
		strcpy(msgs.msg, "gimme token.");

		mret = msgsnd(mid, (struct msgbuf*) &msgs, strlen(msgs.msg)+1, 0);
		if((errno==EIDRM) || (errno==22)) { printf("GAME OVER\n"); exit(0); }
		if(errno==EINTR) { 
			mret = msgsnd(mid, (struct msgbuf*) &msgs, strlen(msgs.msg)+1, 0); 
			if(errno==EIDRM) { exit(0); }
		}
		if(mret<0) {
			perror("Error: Msg Queue send failed.  client.c line 43");
			exit(-1);
		}

		mret = msgrcv(mid, (struct msgbuf*) &msgs, sizeof(msgs.msg), my_pid, MSG_NOERROR);		
		if(errno==EIDRM) {printf("GAME OVER\n"); exit(0); }
		if(errno==EINTR) { 
			mret = msgrcv(mid, (struct msgbuf*) &msgs, sizeof(msgs.msg), my_pid, MSG_NOERROR);
			if(errno==EIDRM) { exit(0); }
		}
		if(mret<0) {
			perror("Error: Msg Queue recieve failed.  client.c line 54");
			exit(-1);
		}

		printf("%d: %s\n", my_pid, msgs.msg);	
		//sleep(1);
	}
    exit(0);
}
